#include "EstadosFatBoy.h"
#include "FatBoy.h"
#include "MiGame.h"

//-------------------------------------------------------------//
//------------- DEAMBULAR 	-----------------------//
//-------------------------------------------------------------//

//-------------------------------------------------------------//
//-------------	Constructor/Destructor	-----------------------//
//-------------------------------------------------------------//

EstadoDeambular::EstadoDeambular() : Estado("EstadoDeambular")
{}

EstadoDeambular::EstadoDeambular(const EstadoDeambular& cpy)
{
	this->m_Nombre = cpy.m_Nombre;
}

EstadoDeambular& EstadoDeambular::operator=(const EstadoDeambular& cpy)
{
	this->m_Nombre = cpy.m_Nombre;
	return *this;
}

EstadoDeambular::~EstadoDeambular()
{}

//-------------------------------------------------------------//
//-----------------		Metodos		---------------------------//
//-------------------------------------------------------------//


EstadoDeambular* EstadoDeambular::Singleton()
{
	static EstadoDeambular instancia;
	return &instancia;
}

void EstadoDeambular::Entrar(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);
	std::cout<<"Entro a EstadoDeambular"<<std::endl;
}

void EstadoDeambular::Ejecutar(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);
	FSM& vehiculoFSM = pEntidad->GetFSM();

 sf::Vector2f dist = pFatBoy->GetPosicion()- pFatBoy->m_pBurger->GetPosicion();
	if( sqrt(dist.x*dist.x+dist.y*dist.y) < 400 )//Si el enemigo esta muy cerca cambia de estado para atacar
	{
		vehiculoFSM.CambiarEstado(EstadoAtacar::Singleton());
		return;
	}
}

void EstadoDeambular::Salir(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);
}





//-------------------------------------------------------------//
//---------------------- ATACAR 	-----------------------//
//-------------------------------------------------------------//

//-------------------------------------------------------------//
//-------------	Constructor/Destructor	-----------------------//
//-------------------------------------------------------------//

EstadoAtacar::EstadoAtacar() : Estado("EstadoAtacar")
{}

EstadoAtacar::EstadoAtacar(const EstadoAtacar& cpy)
{
	this->m_Nombre = cpy.m_Nombre;
}

EstadoAtacar& EstadoAtacar::operator=(const EstadoAtacar& cpy)
{
	this->m_Nombre = cpy.m_Nombre;
	return *this;
}

EstadoAtacar::~EstadoAtacar()
{}

//-------------------------------------------------------------//
//-----------------		Metodos		---------------------------//
//-------------------------------------------------------------//


EstadoAtacar* EstadoAtacar::Singleton()
{
	static EstadoAtacar instancia;
	return &instancia;
}

void EstadoAtacar::Entrar(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);

	std::cout<<"Entro a EstadoAtacar"<<std::endl;

	pFatBoy->GetSteeringBehaviors().InterceptarOn();//Activamos el comportamiento
	pFatBoy->GetSteeringBehaviors().m_pPresa = pFatBoy->m_pBurger;//Establecemos la presa
}

void EstadoAtacar::Ejecutar(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);
	FSM& fatBoyFSM = pEntidad->GetFSM();

	sf::Vector2f dist = pFatBoy->GetPosicion()- pFatBoy->m_pBurger->GetPosicion();
	if( sqrt(dist.x*dist.x+dist.y*dist.y) > 400 )//Si el enemigo esta muy lejos cambia de estado para quedarse quieto
	{
		fatBoyFSM.CambiarEstado(EstadoDeambular::Singleton());
		return;
	}
}

void EstadoAtacar::Salir(EntidadBase* pEntidad)
{
	FatBoy* pFatBoy = dynamic_cast<FatBoy*>(pEntidad);

	pFatBoy->GetSteeringBehaviors().InterceptarOff();
}